<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 1. new Object();
        // var o1 = new Object();
        // o1.name = 'lisi';
        // o1.age = 23;
        // o1.sayHello = function () {
        //     // this指向当前对象
        //     console.log(this.name, this.age);
        // };

        // o1["first name"] = 'haha';

        // console.log(o1["first name"]);

        // var str = "name";

        // console.log(o1[str]);

        // for(var p in o1){
        //     console.log(p + ": " + o1[p]);
        // }

        // 2. {} 对象直接量(literal)
        // var o2 = {
        //     name: 'lisi',
        //     age: 23,
        //     sayHello: function () {
        //         console.log(this.name, this.age);
        //     }
        // }

        // 3. new ClassName
        // class Person{
        //     name = 'lisi';
        //     age = 23;

        //     constructor(name, age){
        //         this.name = name;
        //         this.age = age;
        //     }

        //     sayHello(){
        //         console.log(this.name, this.age);
        //     }
        // }

        // var p1 = new Person('lisi', 23);
        // p1.sayHello();

        // 低版本浏览器创建类的方式
        // var fn = function () {
        //     console.log(this.name, this.age);
        // }
        // 在使用function定义类的时候，我们规定：
        // 1. 在构造中声明属性
        // 2. 在prototype（原型）下声明方法

        // prototype用被设计成用来做继承的

        // function Person(name, age) {
        //     // 自有属性
        //     this.name = name;
        //     this.age = age; 
        // }

        // Person.prototype.sayHello = function () {
        //     console.log(this.name, this.age);
        // }

        // var p1 = new Person('lisi', 35);
        // var p2 = new Person('xiaohua', 35);

        // // 先查找自有属性（方法） -> prototype

        // p1.sayHello();
       


        

        // var person = {
        //     name: 'lisi',
        //     age: 23,
        //     brother: {
        //         name: 'lixx',
        //         age: 34,
        //         wife: {
        //             name: 'wangxx'
        //         }
        //     }
        // }

        // console.log(person.name, person.brother.wife.name);


    //    var fn = function(){
    //        console.log('hehe');
    //    }

    //     var fn = new Function("console.log('hoho')");

    //    fn();

    // 4. Object.create

    var o1 = {
        name: 'lisi',
        age: 23
    };

    var o2 = Object.create(o1);
    // 方法创建一个新对象，使用现有的对象来提供新创建的对象的__proto__
    // o2.__proto__ = o1

    // o2.__proto__.name

    // 原型：
    // ①所有对象都有一个__proto__(隐式原型)属性，属性值是一个普通的对象
    // ②所有函数都有一个prototype(原型)属性，属性值是一个普通的对象
    // ③所有对象的__proto__属性指向它构造函数的prototype

    // console.log(o2.name, o2.age);

    // console.log(o2 == o1); // =>false

    // console.log(o2);
    
    // console.log(o1.__proto__);

    console.log(o1);
    console.log(o2);

    

    </script>
</body>

</html>